home *** CD-ROM | disk | FTP | other *** search
/ Windows Expert / Windows Expert.iso / windownt / wvnsrc75.zip / WVDOC.C < prev    next >
Text File  |  1992-06-10  |  15KB  |  296 lines

  1. /*--- WVDOC.C -- File to contain programmer documentation for WinVN  */
  2. /*  Written by Mark Riordan  November 1989 & February 1990           */
  3. /*  1100 Parker   Lansing MI  48912                                  */
  4.  
  5. #if 0
  6.  
  7. WINVN SOURCE CODE
  8.  
  9. This file contains documentation about the internals of WinVN.
  10. It's written as a C function to be included in WinVN because it seems
  11. to me that separate internals documents tend to get lost, or
  12. separated from the source code.
  13.  
  14. This document assumes that you have used WinVN and have read WINVN.WRI.
  15. Of course, the more you know about Windows programming, the better.
  16.  
  17. The source to WinVN is distributed amoungst several different
  18. files.  Functions are not always placed in the most logical source file.
  19. The source files are:
  20.  
  21. WINVN.C     Main program and initialization.
  22. WVART.C     Window proc for viewing text of articles, plus related functions.
  23. WVBLOCK.C   Functions related to textblocks and lines.
  24. WVCNCM.C    Dialog procedures for setting comm parameters & other dialog boxes.
  25. WVDOC.C     This file.
  26. WVFILE.C    File I/O functions.  Used for NEWSRC and saving articles to disk.
  27. WVGROUP.C   Window proc for Group windows, plus related functions.
  28. WVHEADER.C  Routines to create postings.
  29. WVSCREEN.C  Functions related to manipulating windows.
  30. WVSOCK.C    Communications support.
  31. WVUSENET.C  Window proc for Net (main) window, plus related functions.
  32. WVUTIL.C    Utility routines, including comm FSA.
  33.  
  34. There are only a few header files:
  35.  
  36. WINVN.H     contains function prototypes and constants that we're
  37.             going to give right to Windows, such as menu ids, etc.
  38. WVGLOB.H    contains typedefs and global variables.  This should, perhaps,
  39.             some day be separated into several different header files.
  40. WINUNDOC.H  Taken directly from Charles Petzold's _Programming Windows_.
  41.  
  42. Of course, there are the usual Windows definitions (.DEF) and resource
  43. compiler (.RC) files, as well as the makefile (WINVN.) and the automatic
  44. response file for the linker (.LNK).  There are several icon (.ICO) files,
  45. which describe the appearance of the windows when they are iconified
  46. (minimized).  I invite you to admire my clever art work.
  47.  
  48.  
  49. DISPLAYING TEXT
  50.  
  51. Quite a bit of the code in WinVN concerns the displaying of text in
  52. windows, and manipulating the data structures that contain that text.  I
  53. would like to have used edit child windows in WinVN.  These are entities
  54. provided by Windows; they know all about scrolling, displaying of text,
  55. editing text, etc.  However, these magic entities put their data in the
  56. local heap; therefore, all the edit child windows in a Windows program must
  57. have a total of less than 64K worth of data.  I considered this
  58. unacceptable.  Also, edit child windows know only about text, and I needed
  59. to store more than just text.  For instance, for the name of a newsgroup, I
  60. need to store the numbers of the articles that have already been read from
  61. that newsgroup.  This meant that I had to duplicate a lot of the
  62. functionality of a "standard" text window by large amounts of code in
  63. WinVN.
  64.  
  65. While I was at it, I provided the capability to display text in something
  66. other than the system font.  8 point Helvetica bold, for instance, is
  67. fairly attractive and avoids the problems presented by the system font,
  68. which is fairly wide and makes it difficult to display lines of text
  69. greater than 76 or so characters long.  The text-displaying code in
  70. WinVN undertakes to be fairly efficient at putting up text on the screen by
  71. doing screen bit-block transfers when possible.
  72.  
  73.  
  74. WINVN DATA STRUCTURES:  DOCUMENTS, TEXTBLOCKS, AND LINES
  75.  
  76. Although in the case of an edit child window there is a (very simple) data
  77. structure corresponding to the text on the screen, in general in Windows
  78. there is no universal data structure that is designated to store
  79. information to be displayed in a window.  The displaying of text in a
  80. window is a very "manual" process (unless you use one of Windows' built-in
  81. facilities [like edit child windows], which I am not).  Therefore, I had to
  82. invent my own data structure to correspond to the text you see in a window
  83. in WinVN.
  84.  
  85. I call this data structure a "document".  In WinVN, there is exactly one
  86. "document" for each Network, Group, or Article window.  The document not
  87. only stores text that's to be displayed in the window, but also contains
  88. information such as:
  89.  
  90. -- what part of the text is currently being displayed in the window,
  91. -- pointers to other documents which are superior or subordinate
  92.    to this one,
  93. -- information on the last text string search done on the document,
  94.    in case the user wants to do a "Find Next",
  95. -- and so on.
  96.  
  97. A document contains "lines".  The information stored in each line in a
  98. document depends upon the type of document, but within a document, all
  99. lines have the same format.  Documents are stored in global memory and are
  100. described by the typedef TypLine:
  101.  
  102.    +----------------------------------+          -\
  103.    |  length of line in bytes         |  2 bytes   \
  104.    +----------------------------------+             ] TypLine
  105.    |  Unique line identifier          |  4 bytes   /
  106.    +----------------------------------+          -/
  107.    |  variable number of data bytes   |  variable length
  108.    +----------------------------------+
  109.    |  length of line in bytes (again) |  2 bytes
  110.    +----------------------------------+
  111.  
  112. Different types of documents use different data structures in the
  113. "variable number of data bytes" field.  Incidentally, this is painful
  114. to implement using C structs and results in a lot of typecasts.  In
  115. retrospect, I could have made it slightly better by using unions and
  116. structs, but I'm going to leave it the way it is.
  117.  
  118. In traditional C programming, a programmer might implement a document as a
  119. linked list of TypLine's.  However, this would not have been a very good
  120. idea for WinVN.  For one thing, in a long session with WinVN, thousands of
  121. lines need to be allocated and deallocated.  Allocating and deallocating
  122. lots of variable-length data structures would result in fragmented memory
  123. (though Windows can deal with this to some extent).  Also, it would have
  124. been necessary to execute frequent calls to GlobalLock and GlobalUnlock,
  125. incurring some performance penalty.  Finally, I didn't like the idea of
  126. using a very large number of global handles in Windows--it's wasteful and
  127. might not scale well to Windows 3.0.
  128.  
  129. I therefore decided to implement a textblock system.  Relatively large,
  130. fixed-length blocks of memory are allocated from global memory.  The entire
  131. block is "locked" in memory whenever a line is being accessed.  I am
  132. careful to be a good Windows citizen and use moveable blocks, which I lock
  133. only for a short period of time while I am accessing the data in the block.
  134. This style of programming should port relatively easily to the Macintosh.
  135.  
  136. A textblock has a header of type TypBlock and is described below.
  137. The block is BLOCK_SIZE bytes long.  Actually, the code is written
  138. to support different-sized textblocks for different documents, but
  139. currently all textblocks are the same length.  The active data in
  140. a textblock ends with a pseudo-line that flags the end of the block.
  141.  
  142.  
  143.    +----------------------------------+
  144.    |  Textblock header--various fields|  sizeof(TypBlock)
  145.    +----------------------------------+
  146.    |  Text Lines                      |  variable length
  147.    +----------------------------------+
  148.    |  END_OF_BLOCK                    |  2 bytes  -\
  149.    +----------------------------------+             ] TypLine
  150.    |  Unique pseudo line identifier   |  4 bytes  -/
  151.    +----------------------------------+
  152.    |  Possible unused space           |  variable length
  153.    +----------------------------------+
  154.  
  155.  
  156. Textblocks within a document are doubly-linked to each other.  Each
  157. textblock contains a pointer to its parent document.  Textblocks are
  158. dynamically allocated and freed from global memory.
  159.  
  160. A document consists of a data structure of type TypDoc, and the linked
  161. list of text blocks pointed to by that data structure.  The TypDoc
  162. structure contains quite a bit of information relating to a screen window
  163. and the data in that window.  Several fields in TypDoc answer the question
  164. "Where can I find a particular line?"  The answer is in the form of three
  165. pieces of data:
  166.  
  167. -- The Line ID of the line.  Each line throughout the entire execution of a
  168.    copy of WinVN has its own, unique 4-byte integer line ID.
  169.  
  170.    This line ID is enough, in itself, to uniquely identify the line
  171.    in question.  Line IDs are simply bits patterns; lines are not
  172.    necessarily stored in increasing line ID order.  Therefore, there is no
  173.    index that can be used to locate a line given its line ID.  To locate
  174.    a line, one can either sequentially scan the entire document looking
  175.    for a matching line ID.  However, it is useful for performance reasons
  176.    to first look to see if the line is still in the same place as
  177.    it was last time you noticed it.  The next two pieces of information
  178.    indicate where the line was last found.  WinVN uses these to attempt
  179.    to locate the line; if the line has moved, a sequential scan of the
  180.    document is then used.
  181.  
  182. -- The handle of the textblock that most recently contained the line.
  183.    Lines can move from textblock to textblock when the addition of
  184.    text into the middle of a document causes a textblock split.
  185.  
  186. -- The offset in bytes of the line from the beginning of its textblock.
  187.  
  188. These three pieces of information ought to be combined into a struct.
  189. As it is, they are separate fields in several different places.
  190.  
  191. Document data structures are always stored in local memory.  This is
  192. because they are frequently referenced and because they don't take up much
  193. space.
  194.  
  195.  
  196. DIFFERENT TYPES OF DOCUMENTS
  197.  
  198. WinVN depends upon having one particular window and corresponding document
  199. existing at all times.  This is the "Net" window, which lists all the
  200. newsgroups.  The document is a global variable named NetDoc.  Information
  201. in NetDoc originates from a file named NEWSRC.  There ought to be, but isn't
  202. yet, code to update the list of available newsgroups from the server.
  203.  
  204. Each line in the NetDoc document contains a structure of type TypGroup.
  205. It contains, amoung other things, the name of the newsgroup, whether it's
  206. subscribed, which articles have been seen, and possibly a pointer to a
  207. "Group" document.
  208.  
  209. These Group documents contain a list of the subject lines in the group.
  210. Each line in one of these documents contains a structure of type
  211. TypArticle.  This line contains, amoung other things, an indication as to
  212. whether the article has been seen & possibly a handle to a document
  213. containing the text of the article.  Each Group document contains a pointer
  214. to the line in NetDoc that contains the name of the group.
  215. All Group documents are found in the array GroupDocs.
  216.  
  217. Lines in Article documents contain simply the text of lines in an article.
  218. Each Article document contains a pointer to the Group document, and the
  219. line in that document, that contains the subject line of the article.  All
  220. Article documents are found in the array ArticleDocs.
  221.  
  222.  
  223. POSTING
  224.  
  225. I had planned to hold off on implementing posting until I had some
  226. mechanism for obtaining information about the poster and for
  227. authenticating that information.   This would be the contents of the
  228. "From:" line, the "Organization:" line, and so on.  The Kerberos and
  229. Hesiod pieces of MIT Project Athena would fit the bill.  But these
  230. programs are difficult to implement, and they don't work over
  231. traditional serial lines, which in my mind is a requirement.
  232.  
  233. The problem of authentication doesn't bother me personally very much,
  234. but it is an issue at my place of employment, which I hope will someday
  235. be a user of WinVN.  The problem of name resolution (obtaining a name
  236. and other information) does concern me, because frequently personal
  237. computers are used by several different people.  Especially in
  238. microcomputer laboratory or classroom situations, it would be quite
  239. awkward to have one user's name and personal information associated with
  240. a given PC.
  241.  
  242. While mulling over the proper solution to this problem, I lost patience
  243. and started to implement posting based on profile lines from the [winvn]
  244. section of the WIN.INI file.  As of this writing, I am in the process of
  245. debugging support for posting articles.  I don't know whether I'll
  246. officially release this unauthenticated version.
  247.  
  248. The profile lines I use to support this kludgely solution, and sample uses, are:
  249.  
  250.    UserName=Mark Riordan
  251.    MailAddress=riordanmr@clvax1.cl.msu.edu
  252.    Organization=Michigan State University
  253.  
  254. I should add that proper implementation of authentication would require
  255. that I double-check the contents of the header line after editing by the
  256. user and before actual posting.  Currently, the code in WVHEADER.C does
  257. not check to see if the user has modified any article header lines
  258. before shipping off the article to the news server.
  259.  
  260. Incidentally, the current posting code seems to have some problems.  I'm
  261. not sure whether the problem is in the posting code or in the
  262. communications code--some lines get garbled in transmission.  Because
  263. I'm working on another projet right now, I don't expect that I'll fix or
  264. even look into this bug until early April 1990.
  265.  
  266.  
  267. COMMUNICATIONS
  268.  
  269. WinVN communicates with the NNTP server via either a serial port
  270. (using standard Windows serial port) or TCP/IP (using FTP Software, Inc.'s
  271. PC/TCP).  The serial support works; it requires that you have a serial
  272. line that's talking directly to NNTP.  Typically, this would be serial
  273. login to some Unix machine which is doing a "telnet <host> 119", 119
  274. being the socket number usually assigned to NNTP.
  275.  
  276. TCP/IP supports works functionally, but something in the process winds
  277. up overwriting memory.  Usually, depending upon how WinVN is linked,
  278. WinVN crashes and burns shortly after making the connection.  I can't
  279. yet prove that this is the fault of PC/TCP.  I have succeeded in linking
  280. a limited version of WinVN which talks OK to the server, though it's clear
  281. that some memory is still being overwritten.  I've tried solving, and
  282. then working around, the problem--to no avail so far.  About 50% of
  283. the time I've spent programming WinVN has been spent in trying to get
  284. the verdammt PC/TCP stuff to work with my program.  Small, trivial
  285. test Windows programs work fine with PC/TCP.
  286.  
  287. At any rate, the same parent routines are used to talk to the server
  288. for both serial and TCP/IP connections.  These routines check the
  289. variable UsingSocket and decide which I/O routines to call.
  290.  
  291. The .LNK file distributed with WinVN requires the FTP Software, Inc.
  292. PC/TCP library.  Calls to this library are used only in WVSOCK.C and
  293. would be easy to dummy up if necessary.
  294.  
  295. #endif
  296.